Skip to content

Эксплуатация: устойчивость к падениям, backpressure, лимиты, readiness#22

Open
danscMax wants to merge 1 commit into
ForgetMeAI:mainfrom
danscMax:feat/ops-resilience
Open

Эксплуатация: устойчивость к падениям, backpressure, лимиты, readiness#22
danscMax wants to merge 1 commit into
ForgetMeAI:mainfrom
danscMax:feat/ops-resilience

Conversation

@danscMax

Copy link
Copy Markdown
Contributor

Набор правок для долгоживущего прокси (24/7 за агрегатором). Совместимо по поведению; новые лимиты настраиваются через env с разумными дефолтами.

Что и зачем

  • Устойчивость к падениям. Добавлены process.on(unhandledRejection|uncaughtException)
    — раньше любой неперехваченный reject убивал процесс молча, и ничто не
    перезапускало. Graceful shutdown по SIGTERM/SIGINT (закрыть сервер, форс-выход
    через 10с). server.on('error') ловит EADDRINUSE с понятным сообщением.
  • Backpressure. При превышении DEEPSEEK_MAX_CONCURRENT (24) запрос получает
    503 + Retry-After вместо безграничного веера одновременных вызовов к DeepSeek
    (каждый из которых решает PoW и жжёт квоту аккаунта).
  • Кап тела чат-эндпоинтов (10 МБ) перед JSON.parse — защита памяти.
  • Корректные коды при нехватке пула. Исчерпание аккаунтов → 429 (+Retry-After),
    отсутствие авторизации → 503, а не generic 500. Бэкофф интеграторов теперь
    работает по статус-коду.
  • Бюджет запроса + детект дисконнекта. DEEPSEEK_REQUEST_DEADLINE_MS (120с) и
    res.on('close') останавливают циклы пустого ответа / авто-продолжения, если
    клиент отвалился или вышли за бюджет. MAX_RETRIES 10 → 4 (DEEPSEEK_MAX_RETRIES) —
    10 ретраев по ~5с держали соединение и жгли аккаунт слишком долго.
  • Утечка памяти в пуле сессий. sessions (Map по IP/user) только рос; добавлен
    периодический sweep простаивающих записей.
  • Readiness. GET /readyz отдаёт 503, пока ни один аккаунт не готов (LB/агрегатор
    не льёт трафик в холодный пул); в /health добавлен in_flight.

Проверено

npm test зелёный (+ юнит-тест на sweep сессий). Изменения не трогают логику PoW/стрима.

…mits

- Process-обработчики и graceful shutdown: unhandledRejection/uncaughtException
  больше не убивают прокси молча; SIGTERM/SIGINT закрывают сервер аккуратно
  (форс-выход через 10с); server.on('error') ловит EADDRINUSE с понятным сообщением.
- Лимит конкурентности: при превышении DEEPSEEK_MAX_CONCURRENT (24) — 503 + Retry-After,
  вместо безграничного веера одновременных запросов к DeepSeek.
- Кап тела чат-эндпоинтов (10 МБ) перед JSON.parse — защита памяти.
- Исчерпание пула отдаётся как 429 (+Retry-After) / нет авторизации — 503,
  а не generic 500: бэкофф интеграторов теперь работает по статус-коду.
- Бюджет запроса (DEEPSEEK_REQUEST_DEADLINE_MS, 120с) + детект дисконнекта клиента:
  циклы пустого ответа / авто-продолжения не жгут аккаунты на «мертвый» сокет.
  MAX_RETRIES 10 → 4 (env DEEPSEEK_MAX_RETRIES).
- Sweep простаивающих сессий: Map по IP/user больше не растёт безгранично.
- GET /readyz: 503, пока ни один аккаунт не готов (LB не льёт трафик в холодный пул);
  /health отдаёт in_flight.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant